#
# F E M - Fuckuped Encrypted Messanger
#
#                                by ch4se


#[ FEM-client ]


import socket
import os



#[]=====[основные функции подключения и тд]=====[]#


def connect():
    port = int(input("[введите порт сервера]==> "))
    print("подключаемся к серверу и ждем отправку вопроса...")

    client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    client_socket.connect(("bore.pub", port))

    return client_socket


def verify():
    question = client_socket.recv(1024).decode()
    print("\nвопрос от сервера: ", question)
    answer = input("[введите ответ]==> ")
    client_socket.sendall(bytes(answer, "utf-8"))
    print("\nуспешно отправлено! ждем ответа сервера...")
    answer_server = client_socket.recv(1024).decode()
    
    if answer_server == "0":
        print("ответ верный! соеденение установлено")
    else:
        print("ваш ответ неверный. соеденение будет прервано")
        exit(0)


def chat():
    while 1:
        mes = input("[введите сообщение]==> ")
        mes = mes + " [~]от " + get_name()
        

        #записываем текст нашего сообщения в файл
        mes_file = open("mes.txt","w")
        mes_file.write(mes)
        mes_file.close()

        #шифруем файл открытым ключом друга
        os.system("openssl pkeyutl -encrypt -pubin -inkey friend.public -in mes.txt -out en_mes")

        #читаем из уже зашифрованного файла
        enmes_file = open("en_mes","rb")
        en_mes = enmes_file.read()
        enmes_file.close()
        
        #отправляем зашифрованное сообщение
        client_socket.sendall(en_mes)
        
        mes_recv = client_socket.recv(1024)
        
        #записываем в файл полученное зашифрованное сообщение
        friend_file = open("friend","wb")
        friend_file.write(mes_recv)
        friend_file.close()
        
        #расшифровываем то что записали в файл friend с помощью нашего приватного ключа
        os.system("openssl pkeyutl -decrypt -inkey session -in friend -out friend_decrypt.txt")

        #читаем из friend_decrypt.txt расшифрованное сообщение и выводим его!
        firend_file1 = open("friend_decrypt.txt","r")
        finally_mes = firend_file1.read()
        firend_file1.close()                                                                     
        print(finally_mes)




def gen_session_keys():                                                                
    print("сейчас будет сгенерирована пара ключей для зашифрованного общения!")                            
    print("\n")                                                                                            
    os.system("bash FEM-gen_session_keys.sh")                                                              
    print("ключи успешно сгенерированы!")


def recv_public_key():
    print("\nсейчас будет произведен обмен открытыми ключами...")
    friend_pub = client_socket.recv(1024).decode()
    print("\nключ собеденика получен!\n",friend_pub)
    pub = open("session.public","r")                                                                       
    pub_send = pub.read()                                                                                  
    pub.close()                                                                                            
    client_socket.sendall(bytes(pub_send,"utf-8")) 
    print("ваш ключ отправлен!")

    friend_file = open("friend.public","w")
    friend_file.write(friend_pub)            
    friend_file.close() 


#[]=========================================[]#



#[]============[set,get функции]============[]#


def set_name():
    print("\n[изменение имени]")
    print("текущее имя: ", get_name())
    new_name = str(input("[введите новое имя]==> "))
    name_file = open("config/name.txt","w")
    new_name = new_name + "\n"
    name_file.write(new_name)
    name_file.close()
    print("имя успешно изменено ;)")

def get_name():
    name_file = open("config/name.txt","r")
    name = name_file.read()
    name_file.close()
    return str(name)


#[]=========================================[]#



#[]=======[меню выбора, логотип и тд]=======[]#


os.system("clear && echo 'FEM-client' | figlet | lolcat")
os.system("echo '                                                 by ch4se' | lolcat")


print("[1] - подклюится к серверу ")
print("[2] - изменить имя ")
print("\n")
choose = int(input("[?]==> "))

if choose == 1:
    client_socket = connect()
    verify()
    gen_session_keys()
    recv_public_key()
    chat()

elif choose == 2:
    set_name()

else:
    client_socket.close()
    exit(0)


client_socket.close()


#[]=========================================[]#




